perm filename PSTTIM.PAS[PAS,SYS] blob sn#472159 filedate 1979-09-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(* PROGRAM PSTAT(INFILE*,OUTPUT)       STATEMENT COUNT STATISTICS
C00006 00003	PROGRAM pstat(infile*,output)
C00009 00004	BEGIN (*MAIN PROGRAM*)
C00012 ENDMK
C⊗;
(* PROGRAM PSTAT(INFILE*,OUTPUT);       STATEMENT COUNT STATISTICS
 .
 .       COUNTS AND PRINTS IN READABLE FORM THE COUNTS OBTAINED BY USING THE
 .       PROFILE SWITCH WHEN RUNNING PASCAL PROGRAMS.
 .
 .       THIS PROGRAM IS COMPATIBLE WITH PASCAL/PASSGO AT LOTS/SAIL
 .
 .       WRITTEN ON THE FLY BY POLLE ZELLWEGER AND ARMANDO RODRIGUEZ.
 .
 .               STANFORD, CA, 13-JUL-79
 .               -----------------------
 .
 .INPUT:
 .-----
 .       INFILE: .KNT FILE PRODUCED BY RUNNING THE PROGRAM.
 .OUTPUT:
 .------
 .       OUTPUT: COUNTS CONTAINED IN INFILE, IN HUMAN-READABLE FORM.
 .
 .OPTION SWITCHES:
 .---------------
 .
 .       SWITCH          MEANING                                 DEFAULT
 .
 .       [NO]ZERO        PRINT THE ZERO COUNTS ALSO.             OFF
 .       [NO]SHOW        PRINT AN OUTPUT FILE.                   ON
 .       [NO]PAGE        PUT PAGE MARKS IN THE OUTPUT FILE       ON
 .       FROM:N          FIRST PAGE TO PRINT                     1
 .       TO:N            LAST PAGE TO BE PRINTED                 MAXINT
 .
 .HISTORY:
 .-------
 .       STARTED AROUND 5-JUL-79, TO DEBUG PCREF. IT WAS CALLED READIN THEN.
 .       IMPROVED DURING JUL-79 BY POLLE ZELLWEGER AND ARMANDO RODRIGUEZ.
 .
 .FUTURE PLANS:
 .------------
 .       REPORT ON 'THE N HIGHEST COUNTS'
 .       ZERO COUNTS SHOWN IN FORM 'FROM..TO'
 .       PROCEDURE ONLY COUNTS: BY COUNT, AND BY ZEOROONLY
 .       WHEN PROCEDURE TIMING IS UP, PROCEDURE STATISTICS
 .       WHAT ELSE DO YOU WANT?
 *)


PROGRAM pstat(infile*,output);

CONST
   header = 'PSTAT/SAIL 0.0 13-JUL-79, FRI';
   headlen = 14;

TYPE
   trio = packed RECORD                       (*A LINE-PAGE NUMBER AND ITS COUNT*)
	     line: 0..777777b;
	     timerflag: boolean;
	     pageno: 0..377777b;
	     count: integer;
	  END;

VAR
   infile: FILE OF trio;               (*.KNT FILE*)
   thisone: trio;                      (*THE CURRENT TRIO*)

   nonzeroones,howmany: integer;       (*NUMBERS OF DESCRIPTORS FOUND*)

   oldpageno : integer;                (*NUMBER OF PREVIOUS PAGE*)
   stopit: boolean;                    (*TO GET TWO CHECKS IN THE WHILE*)

   firstpageno,lastpageno: integer;    (*TO GET ONLY SOME PAGES OF THE FILE*)
   showit: boolean;                    (*TRUE IF IT SHOULD PRINT THE DESCRIPTORS*)
   zerotoo: boolean;                   (*TRUE IF IT SHOULD SHOW THE ZERO-COUNT DESCRIPTORS ALSO*)
   paging: boolean;                    (*TRUE IF PAGE MARKS REQUESTED*)

PROCEDURE init;
   (*INITIALIZES SCALARS AND SETS THE BOOLEANS ACCORDING TO THE SWITCHES USED*)

   BEGIN (*INIT*)
   howmany := 0; nonzeroones := 0;
   oldpageno := 0;

   showit := NOT option ('NOSHOW    ');
   paging := showit AND NOT option('NOPAGE    ');
   zerotoo := option('ZERO      ');

   IF option('FROM      ') THEN
      getoption('FROM      ',firstpageno)
   ELSE
      firstpageno := 1;

   IF option('TO        ') THEN
      getoption('TO        ',lastpageno)
   ELSE
      lastpageno := maxint-1;
   END (*INIT*);


BEGIN (*MAIN PROGRAM*)
settime;
write(tty,header:headlen,': PAGE');
break(tty);
init;
IF firstpageno > lastpageno THEN
   message('ARE YOU TESTING ME, OR KIDING ME?')
ELSE    (*NOT KIDING*)
   BEGIN

   reset(infile);                                          (*GET READY*)
   stopit := eof(infile);

   WHILE NOT stopit DO                                     (*GO THROUGH IT*)
      BEGIN
      thisone := infile↑;
      WITH thisone DO
	 IF pageno >= firstpageno THEN                       (*IF NOT THERE YET, NOOP*)
	    BEGIN
	    howmany := howmany + 1;                         (*COUNT THEM*)
	    IF count > 0 THEN
	       nonzeroones := nonzeroones + 1;
	    IF pageno <> oldpageno THEN             (*KEEP PAGE MARKS AND COUNTS*)
	       BEGIN
	       IF paging THEN
		  IF oldpageno > 0 THEN
		     page(output);
	       write(tty,pageno:3,'..');
	       break;
	       oldpageno := pageno;
	       END;
	    IF showit THEN                                  (*PRINT THEM*)
	       IF (count > 0) OR zerotoo THEN
		  BEGIN
		  write(output,line:5,'/',pageno:2,':',count:9);
		  if timerflag then
			write(output,' (timer)');
		  writeln(output);
		  END (*IF (COUNT > 0) OR ZEROTOO*);
	    END (*IF THISONE.PAGENO > FIRSTPAGE*)
      else
	  message('discarded: page',thisone.pageno);
      get(infile);                                        (*READ AND CHECK TERMINATION*)
      stopit := stopit OR eof(infile);
      IF NOT stopit THEN
	 stopit := infile↑.pageno > lastpageno;
      END (*WHILE NOT STOPIT*);

   writeln(tty);
   if howmany = 0 then
	write(tty,'sorry, no marks there')
   else
	write(tty,howmany,' MARKS,',nonzeroones,' EXECUTED,',howmany - nonzeroones,' zeros');
   writeln(tty);
   timereport(ttyoutput,'          ');
   END (*NOT KIDING*);
END (*PCOUNT*).